/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pe.edu.pucp.Envios.DAO;

import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import org.hibernate.Hibernate;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import pe.edu.pucp.Modelo.Aeropuerto;
import pe.edu.pucp.Modelo.Ciudad;
import pe.edu.pucp.Modelo.Configuracion;
import pe.edu.pucp.Modelo.Continente;
import pe.edu.pucp.Modelo.Pais;
import pe.edu.pucp.Modelo.Usuario;
import pe.edu.pucp.Modelo.Vuelo;
import pe.edu.pucp.Util.HibernateUtil;

/**
 *
 * @author katy
 */
public class VueloDAO {
    
    
    public ArrayList<Vuelo> ListarVuelosBusquedaEntrada(Continente continente, Pais pais, Ciudad ciudad, Date fecha, Usuario user){
        
        ArrayList<Vuelo> lstVuelos = new ArrayList<>();
        
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx =  session.beginTransaction();        
        
        String desc = "select vuelo from Vuelo vuelo where vuelo.aeropuertoByIddestino.ciudad.idciudad = :idCiudadfinal ";        
        
        if (continente !=null){
            desc += "and vuelo.aeropuertoByIdorigen.ciudad.pais.continente.idcontinente = :idContinente ";            
        }            
        if (pais !=null){
            desc += "and vuelo.aeropuertoByIdorigen.ciudad.pais.idpais = :idPais ";
        }            
        if (ciudad != null){
            desc += "and vuelo.aeropuertoByIdorigen.ciudad.idciudad = :idCiudad ";
        }                        
        if (fecha != null){
            desc += "and vuelo.salida = :fecha";
        }
        
        Query query = session.createQuery(desc);
        query.setParameter("idCiudadfinal", user.getAeropuerto().getCiudad().getIdciudad());
        
        if (continente !=null){
            query.setParameter("idContinente", continente.getIdcontinente());
        }            
        if (pais !=null){
            query.setParameter("idPais", pais.getIdpais());
        }            
        if (ciudad !=null){
            query.setParameter("idCiudad", ciudad.getIdciudad());
        }            
        if (fecha != null){
            query.setParameter("fecha", fecha);
        }
        List lista = query.list();
        for ( Iterator iter = lista.iterator(); iter.hasNext(); ) {    
            Vuelo c = (Vuelo) iter.next();
            Hibernate.initialize(c.getAeropuertoByIddestino());
            Hibernate.initialize(c.getAeropuertoByIdorigen());
            Hibernate.initialize(c.getSalida());
            Hibernate.initialize(c.getLlegada());
            Hibernate.initialize(c.getAeropuertoByIdorigen().getCiudad().getDescripcion());
            Hibernate.initialize(c.getAeropuertoByIddestino().getCiudad().getDescripcion());
            lstVuelos.add(c);
        }
        tx.commit();
        session.close();
        
        return lstVuelos;
    }
    
    public ArrayList<Aeropuerto> ListarAeropuertos(Continente continente, Pais pais, Ciudad ciudad, Usuario user){
        
        
        ArrayList<Aeropuerto> lstAeropuertos = new ArrayList<>();
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx =  session.beginTransaction();        
        
        String desc = "select aeropuerto from Aeropuerto aeropuerto where aeropuerto.ciudad.idciudad <> :idCiudadfinal ";        
        
        if (continente !=null){
            desc += "and aeropuerto.ciudad.pais.continente.idcontinente = :idContinente ";            
        }            
        if (pais !=null){
            desc += "and aeropuerto.ciudad.pais.idpais = :idPais ";
        }            
        if (ciudad != null){
            desc += "and aeropuerto.ciudad.idciudad = :idCiudad ";
        }                        
        
        
        Query query = session.createQuery(desc);
        query.setParameter("idCiudadfinal", user.getAeropuerto().getCiudad().getIdciudad());
        
        if (continente !=null){
            query.setParameter("idContinente", continente.getIdcontinente());
        }            
        if (pais !=null){
            query.setParameter("idPais", pais.getIdpais());
        }            
        if (ciudad !=null){
            query.setParameter("idCiudad", ciudad.getIdciudad());
        }            
        
        List lista = query.list();
        for ( Iterator iter = lista.iterator(); iter.hasNext(); ) {    
            Aeropuerto c = (Aeropuerto) iter.next();
            Hibernate.initialize(c);                                   
            Hibernate.initialize(c.getCiudad().getDescripcion());
            Hibernate.initialize(c.getCiudad().getDescripcion());
            lstAeropuertos.add(c);
        }
        tx.commit();
        session.close();
        
        return lstAeropuertos;
    }
    public ArrayList<Vuelo> ListarVuelosBusquedaSalida(Continente continente, Pais pais, Ciudad ciudad, Date fecha, Usuario user){
        
        ArrayList<Vuelo> lstVuelos = new ArrayList<>();
        
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx =  session.beginTransaction();        
        
        String desc = "select vuelo from Vuelo vuelo where vuelo.aeropuertoByIdorigen.ciudad.idciudad = :idCiudadfinal ";        
        
        if (continente !=null){
            desc += "and vuelo.aeropuertoByIddestino.ciudad.pais.continente.idcontinente = :idContinente ";            
        }            
        if (pais !=null){
            desc += "and vuelo.aeropuertoByIddestino.ciudad.pais.idpais = :idPais ";
        }            
        if (ciudad != null){
            desc += "and vuelo.aeropuertoByIddestino.ciudad.idciudad = :idCiudad ";
        }                        
        if (fecha != null){
            desc += "and vuelo.salida = :fecha";
        }
        
        Query query = session.createQuery(desc);
        query.setParameter("idCiudadfinal", user.getAeropuerto().getCiudad().getIdciudad());
        
        if (continente !=null){
            query.setParameter("idContinente", continente.getIdcontinente());
        }            
        if (pais !=null){
            query.setParameter("idPais", pais.getIdpais());
        }            
        if (ciudad !=null){
            query.setParameter("idCiudad", ciudad.getIdciudad());
        }            
        if (fecha != null){
            query.setParameter("fecha", fecha);
        }
        List lista = query.list();
        for ( Iterator iter = lista.iterator(); iter.hasNext(); ) {    
            Vuelo c = (Vuelo) iter.next();
            Hibernate.initialize(c.getAeropuertoByIddestino());
            Hibernate.initialize(c.getAeropuertoByIdorigen());
            Hibernate.initialize(c.getSalida());
            Hibernate.initialize(c.getLlegada());
            Hibernate.initialize(c.getAeropuertoByIdorigen().getCiudad().getDescripcion());
            Hibernate.initialize(c.getAeropuertoByIddestino().getCiudad().getDescripcion());
            lstVuelos.add(c);
        }
        tx.commit();
        session.close();
        
        return lstVuelos;
    }
    public ArrayList<Continente> listarContinentes(){
        ArrayList<Continente> lstContinentes = new ArrayList<>();
        
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx =  session.beginTransaction();        
  
        List lista = session.createQuery("from Continente").list();
        for ( Iterator iter = lista.iterator(); iter.hasNext(); ) {    
            Continente c = (Continente) iter.next();
            lstContinentes.add(c);
        }
        tx.commit();
        session.close();        
        
        return lstContinentes;
    }
    
    public ArrayList<Pais> listarPaises(Continente continente){
        ArrayList<Pais> lstPais = new ArrayList<>();
        
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx =  session.beginTransaction();
        
        Query query = session.createQuery("select pais from Pais pais where pais.continente.idcontinente = :idContinente");
        query.setParameter("idContinente", continente.getIdcontinente());
        List lista = query.list();          
        for ( Iterator iter = lista.iterator(); iter.hasNext(); ) {    
            Pais c = (Pais) iter.next();
            lstPais.add(c);
        }
        tx.commit();
        session.close();        
        
        return lstPais;
    }
    
    public ArrayList<Ciudad> listarCiudades(Pais pais){
        ArrayList<Ciudad> lstCiudad = new ArrayList<>();
        
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx =  session.beginTransaction();        
        Query query = session.createQuery("select ciudad from Ciudad ciudad where ciudad.pais.idpais = :idPais");
        query.setParameter("idPais", pais.getIdpais());
        List lista = query.list();
        for ( Iterator iter = lista.iterator(); iter.hasNext(); ) {    
            Ciudad c = (Ciudad) iter.next();
            lstCiudad.add(c);
        }
        tx.commit();
        session.close();        
        
        return lstCiudad;
    }

    public Configuracion ObtenerConf() {
        Configuracion conf = new Configuracion();
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx =  session.beginTransaction();             
        Query query = session.createQuery("from Configuracion");        
        List lista = query.list();        
        for ( Iterator iter = lista.iterator(); iter.hasNext(); ) {    
            conf = (Configuracion) iter.next();                
        }
        tx.commit();
        session.close();
        return conf;
    }
}
